package demo0914;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

class MyThreadPool1 {
    // 1. 描述任务，直接使用Runnable
    // 2. 管理和组织任务
    private BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
    // 3. 描述线程，功能是从队列中获取任务并执行
    static class Worker extends Thread {
        // 当前线程池中有若干个任务，都持有上述队列并从中获取任务
        private BlockingQueue<Runnable> queue = null;

        public Worker(BlockingQueue<Runnable> queue) {
            this.queue = queue;
        }

        @Override
        public void run() {
            while (true) {
                try {
                    // 循环获取任务队列中的任务，如果队列为空就阻塞，非空就获取执行
                    Runnable runnable = queue.take();
                    // 获取之后就去执行
                    runnable.run();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    // 4. 组织线程
    private List<Worker> workers = new ArrayList<>();

    // 提供一个构造方法，接收要线程池中线程的数量
    public MyThreadPool1(int num) {
        for (int i = 0; i < num; i++) {
            // 创建线程
            Worker worker = new Worker(queue);
            // 启动线程
            worker.start();
            // 把线程添加到List中进行组织管理
            workers.add(worker);
        }
    }

    // 5. 创建一个方法，提供添加任务的功能
    public void submit (Runnable runnable) {
        try {
            queue.put(runnable);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


}
public class T3f_0523 {
    public static void main(String[] args) {
        MyThreadPool1 pool = new MyThreadPool1(10);
        for (int i = 0; i < 6; i++) {
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello, thread pool");
                }
            });
        }
    }
}
